package com.mercadoutils.controller;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Random;

import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;

import com.mercadoutils.domain.SendMail;
import com.mercadoutils.listeners.SesionListener;
import com.mercadoutils.security.Encrypter;
import com.mercadoutils.singletons.PoolConectionsSingleton;

@Controller
public class LoginController {
protected final Logger logger = Logger.getLogger(getClass());
    
    @RequestMapping("/login.html")
    public String handleRequest(Model model,
    							@RequestParam(value="username",required=false,defaultValue="") String username,
    							@RequestParam(value="password",required=false,defaultValue="") String password,
    							@RequestParam(value="mail",required=false,defaultValue="") String mail) throws ServletException, SQLException, AddressException, MessagingException{
    	
    	//Controlo si el usuario ya esta logueado
    	HttpSession session = SesionListener.getSession();
    	if(session.getAttribute("userId")!=null)
    		return "home";
    	
    	
    	logger.debug("Usuario entro al login");
    	Connection conexion = PoolConectionsSingleton.getConection();  	

    	
        if(!mail.equals("")){
        	
        	Statement st = conexion.createStatement();
        	ResultSet rs = st.executeQuery("select count(*) as cantidad from muuser where mail='"+mail+"'");
        	rs.next();
        	if(rs.getInt("cantidad")>0){
        		rs = st.executeQuery("select nombre,id from muuser where mail='"+mail+"'");
        		rs.next();
        		String nombre = rs.getString("nombre");
        		int id = rs.getInt("id");
        		String contraseña = getCadenaAlfanumAleatoria(10);
	        	SendMail sendMail = new SendMail();
	        	sendMail.sendMessage(sendMail.messageConstructor(mail, "Nueva contraseña", "Estimado "+
	        	nombre+": <br> A continuacion encontraras una nueva contraseña" +
	        			" con la cual podras ingresar a Mercado Utils y volver a colocar una contraseña " +
	        			"que recuerdes. <br><br> <b>Contraseña:</b> "+contraseña+"<br><br> Muchas gracias por utilizar Mercado Utils", true));
	        	st.executeUpdate("update muuser set passwordAutoGenerada='"+Encrypter.encriptarString(contraseña)+"', fechaPasswordAutoGenerada= sysdate() where id="+id);
	        	 model.addAttribute("message", "Te hemos enviado un email con tu nueva password");
	        	return "loginConfirmation";
	        	}
        	else
        		model.addAttribute("message", "El email no pertenece a ningún <br> usuario de Mercado Utils");
        	return "loginConfirmation";
        }
        else{
        	if(!username.equals("")&&!password.equals("")){            		
        		password = Encrypter.encriptarString(password);
        		System.out.println(password);
        		Statement st = conexion.createStatement();
            	ResultSet rs = st.executeQuery("select id,nombre,apellido,srcImagen,role from muuser where username = '"+username+"' and (password ='"+password+"' or passwordAutoGenerada='"+password+"')");
            	if (rs.next()){
	            	session.setAttribute("userId",rs.getInt("id"));
	            	session.setAttribute("nombre",rs.getString("nombre"));
	            	session.setAttribute("apellido",rs.getString("apellido"));
	            	session.setAttribute("srcImagen",rs.getString("srcImagen"));
	            	session.setAttribute("role",rs.getString("role"));
	            	return "redirect:/auth.html?code=noAuth";
	            	//hacer que el menu lateral agregue lo siguiente:
	            	//Agregar al home nombre, apellido e imagen mediante model.addAttribute("message", resultado);
            	}
            	else{
            		return "login";
            		//TODO informar de usuario y contraseña no valido.
            	}
	        }    
        	else
        		return "login";
        }
    }
    
    @RequestMapping("/registry.html")
    public String handleRequestRegistry(Model model,
    							@RequestParam(value="rUsername") String username,
    							@RequestParam(value="rPassword") String password,
    							@RequestParam(value="rMail") String mail){
    	logger.debug("Se registro un nuevo usuario");
    	
        //TODO hacer que se guarde la informacion del usuario en bd    
    	HttpSession session = SesionListener.getSession();
    	//Agregar a la sesion el id de usuario, nombre, apellido, src de la imagen
    	//Agregar al home nombre, apellido e imagen para que se muestren model.addAttribute("message", resultado);
        return "redirect:/auth.html?code=noAuth";
    }
    
    private String getCadenaAlfanumAleatoria (int longitud){
    	String cadenaAleatoria = "";
    	long milis = new java.util.GregorianCalendar().getTimeInMillis();
    	Random r = new Random(milis);
    	int i = 0;
    	while ( i<longitud){
    	char c = (char)r.nextInt(255);
    	if ( (c>='0' && c<='9') || (c>='A' && c<='Z') ){
    	cadenaAleatoria += c;
    	i ++;
    	}
    	}
    	return cadenaAleatoria;
    	}
}